package main

//
//import (
//	"encoding/json"
//	"fmt"
//	"os"
//	"path/filepath"
//	"sort"
//	"strings"
//	"time"
//
//	"github.com/google/uuid"
//)
//
//// ============================================================================
//// 基础数据结构定义
//// ============================================================================
//
//// SystemConfig 系统配置快照
//type SystemConfig struct {
//	MinSafeLevelM3      float64 `json:"min_safe_level_m3"`
//	MaxSafeLevelM3      float64 `json:"max_safe_level_m3"`
//	InflowRateM3PerHour float64 `json:"inflow_rate_m3_per_hour"`
//	PlanningHorizonH    float64 `json:"planning_horizon_hours"`
//}
//
//// PredictionSnapshot 预测数据快照
//type PredictionSnapshot struct {
//	Prediction3h        []float64 `json:"prediction_3h"`
//	Prediction30min     []float64 `json:"prediction_30min,omitempty"`
//	NextDayPrediction3h []float64 `json:"next_day_prediction_3h,omitempty"`
//}
//
//// ============================================================================
//// 持久化数据结构
//// ============================================================================
//
//// PlanResult 完整的规划结果（支持区间计划）
//type PlanResult struct {
//	ID               string                  `json:"id"`                 // 唯一标识符
//	CreatedAt        string                  `json:"created_at"`         // 规划生成时间
//	PlanDate         string                  `json:"plan_date"`          // 规划日期（YYYY-MM-DD）
//	StartTime        string                  `json:"start_time"`         // 规划开始时间
//	EndTime          string                  `json:"end_time"`           // 规划结束时间（24:00）
//	InitialLevelM3   float64                 `json:"initial_level_m3"`   // 初始水位
//	FinalLevelM3     float64                 `json:"final_level_m3"`     // 最终水位
//	TotalRefillM3    float64                 `json:"total_refill_m3"`    // 总补水量
//	BlockCount       int                     `json:"block_count"`        // 区间总数
//	RefillBlockCount int                     `json:"refill_block_count"` // 有补水任务的区间数
//	TaskCount        int                     `json:"task_count"`         // 补水任务总数（向后兼容）
//	BlockPlans       []SerializableBlockPlan `json:"block_plans"`        // 按区间组织的补水计划
//	SystemConfig     SystemConfig            `json:"system_config"`      // 系统配置快照
//	PredictionData   PredictionSnapshot      `json:"prediction_data"`    // 预测数据快照
//	Metadata         map[string]interface{}  `json:"metadata,omitempty"` // 扩展元数据
//	Version          string                  `json:"version"`            // 数据格式版本
//}
//
//// NewPlanResult 从区间计划创建PlanResult对象
//func NewPlanResult(dp *DailyPlanner, blockPlans []*BlockReplenishmentPlan, finalLevel float64) *PlanResult {
//	// 生成唯一ID
//	planID := uuid.New().String()
//
//	// 计算总补水量和补水区间数
//	totalRefill := 0.0
//	refillBlockCount := 0
//
//	for _, plan := range blockPlans {
//		if plan.HasRefill {
//			totalRefill += plan.RefillAmountM3
//			refillBlockCount++
//		}
//	}
//
//	// 转换为可序列化格式
//	serializablePlans := ConvertToSerializableBlockPlans(blockPlans)
//
//	// 创建结果对象
//	result := &PlanResult{
//		ID:               planID,
//		CreatedAt:        time.Now().Format(time.RFC3339),
//		PlanDate:         dp.startTime.Format("2006-01-02"),
//		StartTime:        dp.startTime.Format(time.RFC3339),
//		EndTime:          dp.endTime.Format(time.RFC3339),
//		InitialLevelM3:   dp.initialLevel,
//		FinalLevelM3:     finalLevel,
//		TotalRefillM3:    round2(totalRefill),
//		BlockCount:       len(blockPlans),
//		RefillBlockCount: refillBlockCount,
//		TaskCount:        refillBlockCount, // 向后兼容
//		BlockPlans:       serializablePlans,
//		SystemConfig: SystemConfig{
//			MinSafeLevelM3:      MinSafeLevelM3,
//			MaxSafeLevelM3:      MaxSafeLevelM3,
//			InflowRateM3PerHour: InflowRateM3PerHour,
//			PlanningHorizonH:    PlanningHorizon.Hours(),
//		},
//		PredictionData: PredictionSnapshot{
//			Prediction3h:        dp.fullDayPrediction3h,
//			Prediction30min:     dp.fullDayPrediction30min,
//			NextDayPrediction3h: dp.nextDayPrediction3h,
//		},
//		Metadata: map[string]interface{}{
//			"generated_by": "WaterPlanner_BlockBased",
//			"go_version":   "1.21+",
//		},
//		Version: "2.0",
//	}
//
//	return result
//}
//
//// PrintPlanSummary 打印规划结果摘要
//func PrintPlanSummary(result *PlanResult) {
//	logTitle(LogLevelInfo, "PLAN SUMMARY (Block-Based)")
//	logMessage(LogLevelInfo, "Plan ID:            %s\n", result.ID)
//	logMessage(LogLevelInfo, "Plan Date:          %s\n", result.PlanDate)
//	logMessage(LogLevelInfo, "Created At:         %s\n", result.CreatedAt)
//	logMessage(LogLevelInfo, "Time Range:         %s -> %s\n",
//		parseTimeRFC3339(result.StartTime).Format(HourLayout),
//		parseTimeRFC3339(result.EndTime).Format(HourLayout))
//	logMessage(LogLevelInfo, "Initial Level:      %.2f m³\n", result.InitialLevelM3)
//	logMessage(LogLevelInfo, "Final Level:        %.2f m³\n", result.FinalLevelM3)
//	logMessage(LogLevelInfo, "Total Refill:       %.2f m³\n", result.TotalRefillM3)
//	logMessage(LogLevelInfo, "Total Blocks:       %d\n", result.BlockCount)
//	logMessage(LogLevelInfo, "Blocks with Refill: %d\n", result.RefillBlockCount)
//	logSubTitle(LogLevelInfo)
//
//	if result.RefillBlockCount > 0 {
//		logMessage(LogLevelInfo, "Blocks with Refill Tasks:\n")
//		count := 1
//		for _, plan := range result.BlockPlans {
//			if plan.HasRefill {
//				logMessage(LogLevelInfo, "  %d. Block %d [%s - %s]:\n",
//					count,
//					plan.BlockIndex,
//					parseTimeRFC3339(plan.BlockStartTime).Format(HourLayout),
//					parseTimeRFC3339(plan.BlockEndTime).Format(HourLayout))
//				logMessage(LogLevelInfo, "     Refill: %s -> %s, %.2f m³ (%s, %s)\n",
//					parseTimeRFC3339(plan.RefillStartTime).Format(HourLayout),
//					parseTimeRFC3339(plan.RefillEndTime).Format(HourLayout),
//					plan.RefillAmountM3,
//					plan.Priority,
//					plan.Reason)
//				count++
//			}
//		}
//	} else {
//		logMessage(LogLevelInfo, "No refill tasks generated.\n")
//	}
//	logSeparator(LogLevelInfo, "=", 60)
//}
//
//// parseTimeRFC3339 解析RFC3339时间字符串
//func parseTimeRFC3339(timeStr string) time.Time {
//	t, _ := time.Parse(time.RFC3339, timeStr)
//	return t
//}
//
//// ============================================================================
//// JSON存储实现
//// ============================================================================
//
//// JSONStorage JSON文件存储实现
//type JSONStorage struct {
//	baseDir string
//}
//
//// NewJSONStorage 创建JSON存储实例
//func NewJSONStorage(baseDir string) (*JSONStorage, error) {
//	if err := os.MkdirAll(baseDir, 0755); err != nil {
//		return nil, fmt.Errorf("failed to create storage directory: %w", err)
//	}
//
//	return &JSONStorage{
//		baseDir: baseDir,
//	}, nil
//}
//
//// Save 保存规划结果到JSON文件
//func (s *JSONStorage) Save(result *PlanResult) error {
//	if result.ID == "" {
//		return fmt.Errorf("plan result ID cannot be empty")
//	}
//
//	// 按日期组织目录结构
//	date, err := time.Parse("2006-01-02", result.PlanDate)
//	if err != nil {
//		return fmt.Errorf("invalid plan date format: %w", err)
//	}
//
//	dayDir := filepath.Join(s.baseDir,
//		fmt.Sprintf("%04d", date.Year()),
//		fmt.Sprintf("%02d", date.Month()),
//		fmt.Sprintf("%02d", date.Day()))
//
//	if err := os.MkdirAll(dayDir, 0755); err != nil {
//		return fmt.Errorf("failed to create day directory: %w", err)
//	}
//
//	filename := filepath.Join(dayDir, fmt.Sprintf("plan_%s.json", result.ID))
//
//	// 序列化为JSON
//	data, err := json.MarshalIndent(result, "", "  ")
//	if err != nil {
//		return fmt.Errorf("failed to marshal plan result: %w", err)
//	}
//
//	// 写入文件
//	if err := os.WriteFile(filename, data, 0644); err != nil {
//		return fmt.Errorf("failed to write plan file: %w", err)
//	}
//
//	logMessage(LogLevelInfo, "✓ Plan saved successfully: %s\n", filename)
//	return nil
//}
//
//// Load 根据ID加载规划结果
//func (s *JSONStorage) Load(id string) (*PlanResult, error) {
//	var result *PlanResult
//
//	err := filepath.Walk(s.baseDir, func(path string, info os.FileInfo, err error) error {
//		if err != nil {
//			return err
//		}
//
//		if !info.IsDir() && strings.HasSuffix(info.Name(), ".json") {
//			if strings.Contains(info.Name(), id) {
//				data, err := os.ReadFile(path)
//				if err != nil {
//					return err
//				}
//
//				var plan PlanResult
//				if err := json.Unmarshal(data, &plan); err != nil {
//					return err
//				}
//
//				if plan.ID == id {
//					result = &plan
//					return filepath.SkipAll
//				}
//			}
//		}
//		return nil
//	})
//
//	if err != nil {
//		return nil, fmt.Errorf("failed to search for plan: %w", err)
//	}
//
//	if result == nil {
//		return nil, fmt.Errorf("plan with ID %s not found", id)
//	}
//
//	return result, nil
//}
//
//// LoadByDate 加载指定日期的所有规划结果
//func (s *JSONStorage) LoadByDate(dateStr string) ([]*PlanResult, error) {
//	date, err := time.Parse("2006-01-02", dateStr)
//	if err != nil {
//		return nil, fmt.Errorf("invalid date format: %w", err)
//	}
//
//	dayDir := filepath.Join(s.baseDir,
//		fmt.Sprintf("%04d", date.Year()),
//		fmt.Sprintf("%02d", date.Month()),
//		fmt.Sprintf("%02d", date.Day()))
//
//	if _, err := os.Stat(dayDir); os.IsNotExist(err) {
//		return []*PlanResult{}, nil
//	}
//
//	entries, err := os.ReadDir(dayDir)
//	if err != nil {
//		return nil, fmt.Errorf("failed to read day directory: %w", err)
//	}
//
//	var results []*PlanResult
//	for _, entry := range entries {
//		if entry.IsDir() || !strings.HasSuffix(entry.Name(), ".json") {
//			continue
//		}
//
//		filePath := filepath.Join(dayDir, entry.Name())
//		data, err := os.ReadFile(filePath)
//		if err != nil {
//			logMessage(LogLevelWarn, "Warning: failed to read file %s: %v\n", filePath, err)
//			continue
//		}
//
//		var plan PlanResult
//		if err := json.Unmarshal(data, &plan); err != nil {
//			logMessage(LogLevelWarn, "Warning: failed to parse file %s: %v\n", filePath, err)
//			continue
//		}
//
//		results = append(results, &plan)
//	}
//
//	// 按创建时间排序
//	sort.Slice(results, func(i, j int) bool {
//		return results[i].CreatedAt < results[j].CreatedAt
//	})
//
//	return results, nil
//}
//
//// List 列出所有规划结果
//func (s *JSONStorage) List(offset, limit int) ([]*PlanResult, error) {
//	var allResults []*PlanResult
//
//	err := filepath.Walk(s.baseDir, func(path string, info os.FileInfo, err error) error {
//		if err != nil {
//			return err
//		}
//
//		if !info.IsDir() && strings.HasSuffix(info.Name(), ".json") {
//			data, err := os.ReadFile(path)
//			if err != nil {
//				logMessage(LogLevelWarn, "Warning: failed to read file %s: %v\n", path, err)
//				return nil
//			}
//
//			var plan PlanResult
//			if err := json.Unmarshal(data, &plan); err != nil {
//				logMessage(LogLevelWarn, "Warning: failed to parse file %s: %v\n", path, err)
//				return nil
//			}
//
//			allResults = append(allResults, &plan)
//		}
//		return nil
//	})
//
//	if err != nil {
//		return nil, fmt.Errorf("failed to list plans: %w", err)
//	}
//
//	// 按创建时间倒序排序
//	sort.Slice(allResults, func(i, j int) bool {
//		return allResults[i].CreatedAt > allResults[j].CreatedAt
//	})
//
//	// 分页
//	if offset >= len(allResults) {
//		return []*PlanResult{}, nil
//	}
//
//	end := offset + limit
//	if end > len(allResults) {
//		end = len(allResults)
//	}
//
//	return allResults[offset:end], nil
//}
//
//// GetLatest 获取最新的规划结果
//func (s *JSONStorage) GetLatest() (*PlanResult, error) {
//	results, err := s.List(0, 1)
//	if err != nil {
//		return nil, err
//	}
//
//	if len(results) == 0 {
//		return nil, fmt.Errorf("no plans found")
//	}
//
//	return results[0], nil
//}
